package com.ddxz.middleground.master.mapper;

import com.ddxz.middleground.master.entity.MenuEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * interface description
 *
 * @author 朱宗刚
 * @version 1.0.0
 * @date 2020/7/30
 */

@Mapper
@Repository
public interface MenuMapper {
    /**
     * 指定应用下菜单个数
     *
     * @param appId  应用标识
     * @param tenant 租户信息
     * @return 菜单个数
     */
    Integer getNumByAppId(@Param("appId") String appId,
                          @Param("tenant") String tenant);

    /**
     * 获取指定菜单的所有子菜单
     *
     * @param appId  应用标识
     * @param menuId 菜单标识
     * @param tenant 租户信息
     * @return 子菜单清单
     */
    List<MenuEntity> getMenuListByParent(@Param("appId") String appId,
                                         @Param("menuId") String menuId,
                                         @Param("tenant") String tenant);

    /**
     * 查询同一个上级节点下指定名称出现的次数
     *
     * @param name     菜单名称
     * @param parentId 上级菜单标识
     * @param tenant   租户信息
     * @return 菜单个数
     */
    Integer getNumByName(@Param("name") String name,
                         @Param("pid") String parentId,
                         @Param("tenant") String tenant);

    /**
     * 查询同一个上级节点下指定名称出现的次数
     *
     * @param code     菜单编码
     * @param parentId 上级菜单标识
     * @param tenant   租户信息
     * @return 菜单个数
     */
    Integer getNumByCode(@Param("code") String code,
                         @Param("pid") String parentId,
                         @Param("tenant") String tenant);

    /**
     * 将菜单信息保存到数据库中
     *
     * @param entity 菜单信息
     * @param tenant 租户信息
     * @return 是否添加成功
     */
    Integer saveMenu(@Param("entity") MenuEntity entity,
                     @Param("tenant") String tenant);

    /**
     * 将菜单信息更新到数据库中
     *
     * @param entity 菜单信息
     * @param tenant 租户信息
     * @return 是否修改成功
     */
    Integer modifyMenu(@Param("entity") MenuEntity entity,
                       @Param("tenant") String tenant);

    /**
     * 获取菜单详情
     *
     * @param menuId 菜单标识
     * @param tenant 租户信息
     * @return 菜单详情
     */
    MenuEntity getMenuDetail(@Param("menuId") String menuId,
                             @Param("tenant") String tenant);

    /**
     * 获取子菜单的个数
     *
     * @param menuId 菜单标识
     * @param tenant 租户信息
     * @return 子菜单个数
     */
    Integer getNumByMenuId(@Param("menuId") String menuId,
                           @Param("tenant") String tenant);

    /**
     * 删除菜单
     *
     * @param menuId 菜单标识
     * @param tenant 租户信息
     * @return 是否删除成功
     */
    Integer removeMenu(@Param("menuId") String menuId,
                       @Param("tenant") String tenant);

    /**
     * 根据位置获取菜单标识
     *
     * @param menuId 上级菜单标识
     * @param order  位置
     * @param tenant 租户信息
     * @return 菜单标识
     */
    String getIdByOrder(@Param("menuId") String menuId,
                        @Param("order") Integer order,
                        @Param("tenant") String tenant);

    /**
     * 获取上级菜单标识
     *
     * @param menuId 菜单标识
     * @param tenant 租户信息
     * @return 上级菜单标识
     */
    String getParentId(@Param("menuId") String menuId,
                       @Param("tenant") String tenant);

    /**
     * 更新指定菜单的位置
     *
     * @param entity 菜单信息
     * @param order  新位置
     * @param tenant 租户信息
     * @return 是否更新成功
     */
    Integer updateOrderById(@Param("entity") MenuEntity entity,
                            @Param("order") Integer order,
                            @Param("tenant") String tenant);

    /**
     * 批量更新菜单的位置信息
     *
     * @param menuId 菜单信息
     * @param order  起始位置
     * @param tenant 租户信息
     * @return 批量更新是否成功
     */
    Integer updateBatchOrder(@Param("menuId") String menuId,
                             @Param("order") Integer order,
                             @Param("tenant") String tenant);

    /**
     * 更新特定位置子菜单的位置
     *
     * @param menuId   菜单标识
     * @param oldOrder 旧位置
     * @param newOrder 新位置
     * @param tenant   租户信息
     * @return 是否更新成功
     */
    Integer updateOrderByOrder(@Param("menuId") String menuId,
                               @Param("oldOrder") Integer oldOrder,
                               @Param("newOrder") Integer newOrder,
                               @Param("tenant") String tenant);

    /**
     * 根据权限清单和应用标识，获取用户可以访问的菜单树
     *
     * @param appId    应用标识
     * @param pId      上级菜单标识
     * @param tenant   租户信息
     * @param permList 权限清单
     * @return
     */
    List<MenuEntity> getMenuListByParentAndPermissions(@Param("appId") String appId,
                                                       @Param("pId") String pId,
                                                       @Param("tenant") String tenant,
                                                       @Param("permIds") List<String> permList);
}
